<?php
/**
 * Created by PhpStorm.
 * User: stupboy
 * Date: 2018/5/3
 * Time: 10:13
 * Mail:87658989@qq.com
 */

namespace app\adminapi\controller;

use app\adminapi\validate\OrderValidate;
use app\adminapi\validate\Report;
use app\base\service\Csv;
use think\Db;
use think\Exception;

/**
 * @name【订单管理】
 * @baseurl【adminapi/Order】
 * @file【Order.php】
 */
class Order extends Base
{
    /**
     * @name【异常订单列表】
     * @desc【异常订单列表】
     * @uri【getExceptionOrder】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1#
     * car_number $ string $ 闽C $ 车牌 #
     * exception_type $ int $ 1 $ 异常类型，多个传 1,2,4 #
     * page $ int $ 1 $ 页数 #
     * pagenum  $ int $ 10 $ 记录数
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息#
     * data $ int $  $ 数据 $[{"order_exception_id":83,"order_id":28967,"exception_type":14,"exception_desc":"目的地偏移16081.6米;超过预计时间3倍;超过预计里程2.3倍","has_solve":9,"exception_note":null,"passenger_note":null,"driver_note":null,"add_time":"2018-05-03 00:10:38","order_no":"P20180502171250007","passenger_name":"陈百瑜","driver_name":"王明山"},{"order_exception_id":92,"order_id":28946,"exception_type":14,"exception_desc":"目的地偏移4620米;超过预计时间7.7倍;超过预计里程2.5倍","has_solve":9,"exception_note":null,"passenger_note":null,"driver_note":null,"add_time":"2018-05-03 00:10:43","order_no":"P20180502144834265","passenger_name":"吴燕清","driver_name":"柯长奕"}]
     * 】
     */
    public function getExceptionOrder(){
        $page      = input('page',1);
        $pageNum   = input('pagenum',10);
        $whereNew  = [];
        $carNumber = input('car_number');
        $type      = input('exception_type');
        $carNumber && $whereNew['car_number'] = ['like','%'.$carNumber.'%'];
        if($type){
            $typeArr = explode(',',$type);
            $limit   = arrayMixedSum($typeArr);
            $whereNew['exception_type'] = ['not in',implode(',',$limit)];
        }
        $field = 'a.*,b.order_no,b.passenger_name,c.name driver_name,a.apply_number,a.order_text';
        //原数据
        $list    = Db::name('order_exception')->alias('a')
            ->join('order b','a.order_id = b.order_id','left')
            ->join('driver c','b.driver_id = c.driver_id','left')
            ->field($field)
            ->where($whereNew)
            ->page($page,$pageNum)->order('order_exception_id desc')->select();
        $data = [];
        //临时：2018年5月6日 18:12:50
//        $list    = Db::name('order')->alias('a')
//            ->join('order_exception b','a.order_id = b.order_id','left')
//            ->join('driver c','a.driver_id = c.driver_id','left')
//            ->field('b.*,a.order_no,a.passenger_name,c.name driver_name')
//            ->where('order_state', '>', 5)
//            ->where($whereNew)
//            ->page($page,$pageNum)->order('order_id desc')->select();
        foreach ($list as $v){
            if(empty($v['order_no'])){
                $v['order_no'] = $v['apply_number'];
                $arr = explode('$$',$v['order_text']);
                $v['passenger_name'] = $arr[1];
                $v['driver_name']    = $arr[0];
            }
            $data[] = $v;
        }
        $count   = Db::name('order_exception')->alias('a')
            ->join('order b','a.order_id = b.order_id','left')
            ->join('driver c','b.driver_id = c.driver_id','left')
            ->field($field)
            ->where($whereNew)
            ->count();
        return $this->retSucc(['count'=>$count,'data'=>$data]);
    }

    /**
     * @name【异常处理】
     * @desc【异常处理】
     * @uri【dealException】
     * @method【post】
     * @param【
     *  token $ string $ abc $ 验证字符 $ 1 #
     *  uid $ int $ 1 $ 用户id $ 1#
     *  eid $ int $ 1 $ 异常id $1 #
     *  note $ string $ 修车 $解释原因 $ 1
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息
     * 】
     */
    public function dealException(){
        $id                = input('eid',0);
        if($id==0){
            return $this->retError('异常id不能为空');
        }
        $data['exception_note']      = input('note','');
        if(empty($data['exception_note'])){
            return $this->retError('处理原因不能为空');
        }
        $data['has_solve'] = 1;
        try{
            Db::name('order_exception')->where('order_exception_id',$id)->update($data);
        }catch (Exception $e){
            return $this->retError($e->getMessage());
        }
        return $this->retSucc();
    }

    /**
     * @name【提交订单申请】
     * @desc【提交订单申请】
     * @uri【orderApply】
     * @method【post】
     * @param【
     * token $ string $ token $ 校验码 $ 1#
     * car_type_id $ string $ 1 $ 车辆类型，2：优选型，3：舒适型，4：豪华型，5：小巴，6：中巴，7：大巴，8：执法车 $ 1#
     * order_type $ string $ 1 $ 订单类型 订单类型,1：公务订单，2：企业订单，3：个人订单 $ 1#
     * passenger_name $ string $ 小猪啊 $ 乘客姓名 $ 1#
     * passenger_phone $ string $ 17689 $ 乘客电话 $ 1#
     * orderer_name $ string $ 小猫啊 $ 下单人 $ 1#
     * from_addr $ string $ 石狮 $ 出发地 $ 1#
     * from_lat $ string $ 12.33 $ 出发地纬度 $ 1#
     * from_lon $ string $ 12.33 $ 出发地经度 $ 1#
     * estimate_mileage $ string $ 12.6 $ 公里数 $ 1#
     * booking_type $ string $ 1 $ 订车类型：1，订车（日常）。2，包车。3，分时租赁 $ 1#
     * appointment_time $ string $ 2017-07-17 12：05：05 $ 预约时间#
     * pay_type $ string $ 1 $ 2-单位支付 3-财政支付,order_type=1#
     * approval_id $ int $ 1 $ 审核人id order_type=1时必填 #
     * approval_name $ string $ 1 $ 审批人 order_type=1时必填#
     * use_explain $ string $ 1 $ 用车说明 order_type=1#
     * use_type $ string $ 1 $ order_type=1 用车类型 1：行政执法，2：特殊公务，3：重要会议，4：机要通讯，5：视察调研，6：公务接待#
     * is_return $ string $ 1 $ booking_type=1，1-需要返程  9-无需#
     * to_addr $ string $ 晋江 $ booking_type=1，目的地#
     * to_lat $ string $ 12.12 $ booking_type=1，目的地纬度#
     * to_lon $ string $ 12.12 $ booking_type=1，目的地经度#
     * pre_meter $ string $ 12.12 $ 预计xx米 $ 1#
     * pre_time $ string $ 12.12 $ 预计时间 $ 1#
     * reorder $ int $ 0 $ 是否续单 0为否 续单请求下传原单id #
     * pre_fee $ string $ 12.12 $ 预计费用 $ 1
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息#
     * data $ string $ $ 列表 #{"from_addr":"1","from_lon":"1","from_lat":"1","plan_time":"2018-03-20 16:30","call_time":"2018-03-22 09:27:46","order_id":"26343","order_no":"201803220927461267242426"}
     * 】
     */
    public function orderApply()
    {
        $string = 'car_type_id|0#车型@require|number/order_type#订单类型@require|number/';
        $string.= 'passenger_name#乘客姓名@require|chsDash/passenger_phone#乘客电话@require|number|length:11/';
        $string.= 'booking_type|1#预定类型@require|number/is_return#返程@number/reorder|0#续单@number/';
        $string.= 'passenger_id#乘客ID@require/pay_type#支付类型@require|number/orderer_name||orderer#下单人@require';
        $data   = $this->getBatchParam($string);
        /* 前台直接传入 2018年5月18日 20:33:37
        $where['type']      = $data['order_type'] == 2 ? 3 + $data['booking_type'] : $data['order_type'] + $data['booking_type'];
        $where['car_type']  = $data['car_type'];
        unset($data['car_type']);
        $data['car_type_id']= Db::name('car_type')->where($where)->value('car_type_id');*/
        $data['area_id']        = 4;
        $data['company_id']     = Db::name('passenger')->where('passenger_id',$data['passenger_id'])->value('company_id');
        $string                 = 'from_addr#出发地@require/from_lon#出发经度@require|float/from_lat#出发纬度@require|float/appointment_time|-|plan_time#出发时间@require';
        $gpsData                = $this->getBatchParam($string);
        $gpsData['plan_time']   = $gpsData['plan_time'] > date('Y-m-d H:i:s') ? $gpsData['plan_time'] : date('Y-m-d H:i:s');
        $gpsData['call_time']   = date('Y-m-d H:i:s');
        $string                 = 'pre_meter|0#require|float/pre_time|0#require|float/pre_fee|0#require|float';
        $feeData                = $this->getBatchParam($string);
        $data['order_type'] == 3 && $data['order_state'] = 4;
        // 存在个人未支付订单 已派车订单，无法在使用个人订单
        if($data['order_type'] == 1){
            $data['order_state'] = 1;
            $data['apply_time']  = date('Y-m-d H:i:s', time());       //申请时间
            $string = 'pay_type#支付类型@require|number/approval_id#审核人ID@require|number/approval_name|-|approval#审核人@require|chsDash/';
            $string.= 'use_explain#用车说明@require/use_type#用车类型@number';
            $data1  = $this->getBatchParam($string);
            $data   = array_merge($data,$data1);
            $data['use_type'] = $data['pay_type'] == 2 ? 0 : $data['use_type'];
        }
        if($data['booking_type']==1){
            $string   = 'to_addr#目的地@require/to_lon#目的经度@require|float/to_lat#目的纬度@require|float';
            $gpsData1 = $this->getBatchParam($string);
            $gpsData  = array_merge($gpsData,$gpsData1);
        }
        if(!($data['booking_type'] == 1 && $data['order_type'] == 1)){
            unset($data['is_return']);
        }
        list($code, $msg)   = (new \app\api\logic\Order())->createOrder($data, $gpsData, $feeData);
        if($code==1){
            return $this->retSucc();
        }else{
            return $this->retError($msg);
        }
    }

    /**
     * @name【获取订单预计费用】
     * @desc【获取订单预计费用】
     * @uri【getOrderPreFee】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * car_type_id $ int $ 1 $ 车型id $ 1 #
     * estimate_mileage $ string $ 1 $ 公里数 $ 1 #
     * estimate_time $ int $ 1 $ 用时间秒 #
     * order_type $ string $ 1 $ 订单类型 $ 1 #
     * is_return $ string $ 1 $ order_type=1,是否往返
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息
     * 】
     */
    public function getOrderPreFee(){
        $car_type_id = input('car_type_id',0);
        $string   = 'estimate_mileage|0|mile#里程@require|float/estimate_time|0|time#时间@number/is_return|9#是否返程@require|in:1,9';
        $data     = $this->getBatchParam($string);
        $car_info = Db::name('car_type')->where('car_type_id',$car_type_id)->where('state',1)->whereNull('delete_time')->find();
        if (!$car_info) {
            return $this->retError('无该车辆类型/已停用！');
        }
        $cost_info = (new \app\api\model\OrderFee())->countPreFee($car_info,$data['mile']*1000,$data['time'],$data['is_return']);
        $code      = empty($cost_info) ? 0 : 1;
        $msg       = empty($cost_info) ? '计算车费出错' : $cost_info;
        if($code==1){
            $dataBack['data'] = $msg;
            $string = 'starting_price|起步价,estimate_cost|预计费用';
            $dataBack['description'] = analyzeDesc($string);
            return $this->retSucc($dataBack);
        }else{
            return $this->retError($msg);
        }
    }

    /**
     * @name【订单列表】
     * @desc【订单列表】
     * @uri【orderList】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * fields $ string $ order_id,passenger_name $ 字段名称 #
     * where_json $ json $ {"order_id":["in","6,7,8"],"name":["like","%王%"]} $ 查询条件 #
     * page $ int $ 1$ 页数 #
     * pagenum $ int $ 10 $记录数
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息 #
     * data $ json $ $ 订单列表 #
     * description $ json $ $ 接口说明
     * 】
     */
    public function orderList(){
        $reportValidate = new Report();
        $param          = $reportValidate->scene('report')->getCurrentData();
        $reportValidate->scene('report')->goCheck($param);
        $where          = json_decode($param['where_json'],true);
        list($code,$data) = (new \app\adminapi\model\Order())->orderList($param['fields'],$where,$param['page'],$param['pagenum']);
        if($code==1){
            return $this->retSucc($data);
        }else{
            return $this->retError($data);
        }
    }

    /**
     * @name【获取订单北斗轨迹】
     * @desc【获取订单北斗轨迹】
     * @uri【getOrderBeidouTrack】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * order_id $ int $ 1 $ 订单id $ 1
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息 #
     * data $ json $ $ 订单列表 #
     * description $ json $ $ 接口说明
     * 】
     * @throws \app\base\exception\RecordNotFoundException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getOrderBeidouTrack(){
        $oid  = input('order_id',0);
        $data = (new \app\adminapi\model\Order())->getOrderBeidouTrack($oid);
        return $this->retSucc($data);
    }

    /**
     * @name【订单列表下载】
     * @desc【订单列表下载】
     * @uri【downLoadOrderList】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * fields $ string $ order_id,passenger_name $ 字段名称 #
     * where_json $ json $ {"order_id":["in","6,7,8"],"name":["like","%王%"]}$ 查询条件 #
     * counts $ int $ 1$ 下载数据记录数
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息 #
     * data $ json $ $ 订单列表 #
     * description $ json $ $ 接口说明
     * 】
     */
    public function downLoadOrderList(){
        set_time_limit(300);
        $csv       = new Csv();
        $field     = input('fields','*');
        $whereJson = input('where_json','');
        $counts    = input('counts',9999999);
        $where     = json_decode($whereJson,true);
        $totalPage = $counts % 2000 == 0 ? $counts/2000 : floor($counts/2000) + 1;
        $f = [];

        $order_types = [
            1 => '公务订单',
            2 => '企业订单',
            3 => '个人订单',
        ];

        $order_states = [
            1 => '待审批',
            2 => '已批准',
            3 => '已拒绝',
            4 => '待用车',
            5 => '已派车',
            6 => '接驾中',
            7 => '已到达出发地',
            8 => '已到达目的地',
            9 => '待支付',
            10 => '待评价',
            11 => '已完成',
            12 => '已取消',
            13 => '已终止',
            14 => '无效',
        ];

        for($i=1;$i<=$totalPage;$i++){
            list($code,$data) = (new \app\adminapi\model\Order())->orderList($field,$where,$i,2000);
            if($code==0) continue;
            if(empty($data['data'])) break;
            $csv->open($data['fields']);
            //以下by玉林
            foreach ($data['data'] as &$item) {
                $item = is_object($item) ? $item->toArray() : $item;
                $item['order_type'] = isset( $order_types[ $item['order_type'] ] ) ? $order_types[ $item['order_type'] ] : '';
                $item['order_state'] = isset( $order_states[ $item['order_state'] ] ) ? $order_states[ $item['order_state'] ] : '';

                if($item['meter']){
                    $item['meter'] = sprintf('%.2f公里', $item['meter'] / 1000);
                }

                if($item['use_time']) {
                    $item['use_time'] = formatTime($item['use_time']);
                }

                // 处理特殊字符
                foreach($item as &$value) {
                    $value = str_replace("\r\n" , '', $value);
                    $value = str_replace("\n" , '', $value);
                    $value = str_replace("," , '，', $value);
                }
            }

            //以上by玉林
            $csv->writeAll($data['data']);
            $f[] = $csv->myClose();
        }
        $csv->mergeCsvToDownload($f);
    }

    /**
     * @name【是否有新的订单】
     * @desc【是否有新的订单】
     * @method【post】
     * @param【
     *
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息#
     * data $ int $  $ 数据 $[1: 有  9：无]
     * 】
     */
    public function hasNew() {

        //Session
        $ids = session('new_oids');

        $ids = $ids ?: [];
        $id = Db::name('Order')->where('order_id','NOT IN',$ids)->where('order_state',2)->fetchSql(0)->value('order_id');

        $has = 9;
        if($id) {
            $has = 1;
            $ids[] = $id;
            session('new_oids',$ids);
        }

        return $this->apiout($has);

    }

    /**
     * @name【司机评价（订单）】
     * @desc【】
     * @method【post】
     * @param【
     * 	name $ string $ 测试  $  司机名  $ 0 #
     *  phone $ string $ 13265623536  $  手机号  $ 0 #
     * 	order_no $ string $ P20170103164079460 $ 订单  $ 0 #
     * 	start $ date $ 2018-06-26 $ 时间区间开始 $ 0 #
     * 	end $ date $ 2018-06-26 $ 时间区间结束 $ 0 #
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息#
     * data $ int $  $ 数据 $[1: 有  9：无]
     * 】
     */
    public function evaluate() {

        $name = input('param.name');
        $phone = input('param.phone');
        $start = input('param.start');
        $end = input('param.end');
        $order_no = input('param.order_no');
        $page = input('param.page',1);

        $where = [];
        $phone && $where['d.phone'] = ['like',"%$phone%"];
        $name && $where['d.name'] = ['like',"%$name%"];
        $order_no && $where['order_no'] = ['like',"%$order_no%"];

        $start && $where['evaluate_time'][] = ['>=',$start];
        $end && $where['evaluate_time'][] = ['<=',$end];


        $where['order_state'] = ['IN','10,11'];
        $list = Db::name('Order')->alias('o')
            ->join('driver d','d.driver_id = o.driver_id')
            ->where($where)->limit(10)->page($page)->order('apply_time')->fetchSql(0)->select();

        $count = Db::name('Order')->alias('o')
            ->join('driver d','d.driver_id = o.driver_id')
            ->where($where)->count();

        $data = [
            'count' => $count,
            'list' => $list,
        ];

        return $this->retAll($data);

    }

    /**
     * @name【备注订单】
     * @desc【备注订单】
     * @uri【remark】
     * @method【post】
     * @param【
     * order_id $ int $ 1 $ 订单id $ 1 #
     * exception_remark $ string $ 我也不知道备注什么 $ 备注  #
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息#
     * updated $ int $  1 $ 更新记录条数#
     * 】
     * @return false|int
     * @throws \app\base\exception\RecordNotFoundException
     * @throws \think\exception\DbException
     */
    public function remark() {
        $params = (new OrderValidate())->scene('exception_remark')->goCheck()->getCurrentData();

        $result =  (new \app\adminapi\model\Order())->remark($params);

        return $this->retSucc(['updated' => $result]);
    }
}